---
title: EmacsLisp 调试的方法
tags:
  - emacs
categories:
  - 效率
layout: post
---

<div id="outline-container-org5164fc6" class="outline-2">
<h2 id="org5164fc6">记录关于如何调试elisp</h2>
<div class="outline-text-2" id="text-org5164fc6">
</div>
<div id="outline-container-orgd43296d" class="outline-3">
<h3 id="orgd43296d">debug-on-entry</h3>
<div class="outline-text-3" id="text-orgd43296d">
</div>
<ul class="org-ul">
<li><a id="orgfa23ea3"></a>适用范围<br />
<div class="outline-text-4" id="text-orgfa23ea3">
<ol class="org-ol">
<li>该方法比较初级，适用于简单调试单个函数；</li>
<li>如果函数调用栈较深，不适合使用该方法；</li>
</ol>
</div>
</li>
<li><a id="org78cb5e5"></a>启用方法<br />
<div class="outline-text-4" id="text-org78cb5e5">
<ol class="org-ol">
<li>使用M-x debug-on-entry[RET]&lt;function_name&gt;[RET]启用；</li>
<li>在代码中，当调用&lt;function_name&gt;函数时，进入该函数的调用模式；</li>
<li>调试信息将显示在"Backtrace"缓冲区，可以观察调用栈；</li>
</ol>
</div>
</li>
<li><a id="org5e79ebd"></a>调试方法<br />
<div class="outline-text-4" id="text-org5e79ebd">
<ol class="org-ol">
<li>当进入调试模式后，在"Backtrace"中，按下d键进行调试，单步执行表达式
求值。</li>
<li>在"Backtrace"中，按下q键退出调试。</li>
</ol>
</div>
</li>
<li><a id="orgdd44491"></a>关闭调试<br />
<div class="outline-text-4" id="text-orgdd44491">
<p>
通过M-x cancel-debug-on-entry[RET]&lt;function_name&gt;[RET]解除函数的调试
</p>
</div>
</li>
</ul>
</div>
<div id="outline-container-org13306e3" class="outline-3">
<h3 id="org13306e3">debug-on-error</h3>
<div class="outline-text-3" id="text-org13306e3">
</div>
<ul class="org-ul">
<li><a id="org41e6ac5"></a>适用范围<br />
<div class="outline-text-4" id="text-org41e6ac5">
<ol class="org-ol">
<li>在出现错误的时候，进入错误的函数的调试模式；</li>
<li>该方法不能选择函数；</li>
</ol>
</div>
</li>
<li><a id="orgfdae8fb"></a>启用方法<br />
<div class="outline-text-4" id="text-orgfdae8fb">
<ol class="org-ol">
<li>M-x set-variable[RET]debug-on-error[RET]t</li>
<li>在下次遇到错误时，进入调试模式，调试信息将显示在"Backtrace"缓冲区。</li>
</ol>
</div>
</li>
<li><a id="orgcfc664c"></a>调试方法<br />
<div class="outline-text-4" id="text-orgcfc664c">
<p>
与debug-on-entry的方法类似
</p>
</div>
</li>
<li><a id="orgb097667"></a>关闭调试<br />
<div class="outline-text-4" id="text-orgb097667">
<ul class="org-ul">
<li>通过M-x set-variable[RET]debug-on-error[RET]nil。</li>
<li>使用M-x toggle-debug-on-error功能，进行debug-on-error切换。</li>
</ul>
</div>
</li>
</ul>
</div>
<div id="outline-container-org30b1d4f" class="outline-3">
<h3 id="org30b1d4f">debug-on-quit</h3>
<div class="outline-text-3" id="text-org30b1d4f">
</div>
<ul class="org-ul">
<li><a id="org3e3ef65"></a>适用范围<br />
<div class="outline-text-4" id="text-org3e3ef65">
<p>
该方式的特征是：在按下C-g时进入调试模式，用于调试死循环；
</p>
</div>
</li>
<li><a id="org4af3d89"></a>启用方法<br />
<div class="outline-text-4" id="text-org4af3d89">
<ol class="org-ol">
<li>M-x toggle-debug-on-quit，或者M-x set-variable[RET]debug-on-quit[RET]t</li>
<li>在启用后，任何时刻按下C-g都可以进行调试</li>
</ol>
</div>
</li>
<li><a id="orge106732"></a>关闭调试<br />
<div class="outline-text-4" id="text-orge106732">
<ul class="org-ul">
<li>M-x toggle-debug-on-quit</li>
<li>M-x set-variable[RET]debug-on-quit[RET]nil</li>
</ul>
</div>
</li>
</ul>
</div>
<div id="outline-container-org30c06ea" class="outline-3">
<h3 id="org30c06ea">edebug (源码级调试器)</h3>
<div class="outline-text-3" id="text-org30c06ea">
</div>
<ul class="org-ul">
<li><a id="org6628002"></a>启用方法<br />
<div class="outline-text-4" id="text-org6628002">
<ul class="org-ul">
<li>对函数执行C-u C-M-x来绑定函数，当调用函数时，将进入函数的调试模式。</li>
</ul>
</div>
</li>
<li><a id="org41b4e6e"></a>调用方法<br />
<div class="outline-text-4" id="text-org41b4e6e">
<ol class="org-ol">
<li>使用SPC进行单步调试，箭头显示当前正在执行的函数；</li>
<li>在执行结束后，按下c结束当前的调试，以准备进入下一次调试；</li>
</ol>
</div>
</li>
<li><a id="orgc140351"></a>关闭调试<br />
<div class="outline-text-4" id="text-orgc140351">
<ul class="org-ul">
<li>M-x edebug-reomve-instrumentation[RET]&lt;function-name&gt;[RET]，移除特定
函数的绑定；</li>
<li>M-x edebug-remove-instrumentation[RET][RET]，移除全部绑定的函数；</li>
</ul>
</div>
</li>
<li><a id="org4db8c52"></a>学习资料<br />
<div class="outline-text-4" id="text-org4db8c52">
<ul class="org-ul">
<li>官方文档中的演示：<a href="https://www.gnu.org/software/emacs/manual/html_node/eintr/edebug.html#edebug">17.4 The edebug Source Level Debugger</a></li>
<li><a href="https://www.gnu.org/software/emacs/manual/html_node/elisp/Edebug.html#Edebug">18.2 Edebug</a></li>
</ul>
</div>
</li>
</ul>
</div>
</div>
